﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Demo01
{

    class Program3
    {
        /*静态字段存储的值在所有实例化之间是共享的。

        作业：
        现在开班了，班里老师只有一个，叫唐僧。班里的五个人都知道老师叫唐僧
        (也就是说老师这个字段是共享的)。但是某一天唐僧要去女儿国走丈母娘家了，
        课不能停啊。所以就请嫦娥姐姐过来带一段课。

        现在5个学生都知道老师换成嫦娥姐姐了，都很激动哈。但是她们是怎么都知道换老师的呢？
        还是这个静态字段的功劳，将老师姓名声明为静态字段，这个字段是共享的。
        所以该类的属性都能知道。

        请用代码写出上面的剧情。

        提示：
        定义一个学生类（有哪些字段属性？修饰符是什么？自己考量定义，至少学生姓名要吧），
        定义一个有参构造方法用来初始化学生姓名。学生类中定义一个成员方法，用来输出学生的信息。

        Main方法中，创建5个学生对象，每个学生执行输出学生信息的方法。
        学生的老师变更，
        再执行每个学生执行输出学生信息的方法。*/
        static void Main(string[] args)
        {
            Person[] pers = new Person[6];
            pers[0] = new Teacher("嫦娥");
            for (int i = 1; i < pers.Length; i++)
            {
                pers[i] = new Student($"学生{i}号", i);
            }
            Student.Teacher.SayHello();
            for (int i = 1; i < pers.Length; i++)
            {
                pers[i].SayHello();
            }
            Student.Teacher = (Teacher)pers[0];
            for (int i = 0; i < pers.Length; i++)
            {
                pers[i].SayHello();
            }
        }
    }

    public abstract class Person
    {
        private string name;

        protected Person()
        {
        }

        protected Person(string name)
        {
            Name = name;
        }

        public string Name { get => name; set => name = value; }

        public abstract void SayHello();
    }
    public class Student : Person
    {
        private int stuNum;
        private static Teacher teacher;

        public Student()
        {
        }

        public Student(string name, int stuNum) : base(name)
        {
            this.StuNum = stuNum;
        }

        static Student()
        {
            Teacher = new Teacher("唐僧");
        }

        public int StuNum { get => stuNum; set => stuNum = value; }
        public static Teacher Teacher { get => teacher; set => teacher = value; }

        public override void SayHello()
        {
            Console.WriteLine($"My name is {this.Name},My Num is {this.StuNum},My teacher is {Teacher}");
        }
    }

    public class Teacher : Person
    {
        public Teacher()
        {
        }

        public Teacher(string name) : base(name)
        {
        }

        public override void SayHello()
        {
            Console.WriteLine($"i am a teacher,my name is {this.Name}");
        }

        public override string ToString()
        {
            return this.Name;
        }
    }
}